//
//  Problem594.swift
//  LeetCode
//
//  Created by 武侠 on 2023/6/21.
//  Copyright © 2023 zhulongiMac02. All rights reserved.
//

import UIKit

/*
 594. 最长和谐子序列   简单
 
 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
 现在，给你一个整数数组 nums ，请你在所有可能的子序列中找到最长的和谐子序列的长度。
 数组的子序列是一个由数组派生出来的序列，它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。

 示例 1：
     输入：nums = [1,3,2,2,5,2,3,7]
     输出：5
     解释：最长的和谐子序列是 [3,2,2,2,3]
 示例 2：
     输入：nums = [1,2,3,4]
     输出：2
 示例 3：
     输入：nums = [1,1,1,1]
     输出：0

 提示：
 1 <= nums.length <= 2 * 104
 -109 <= nums[i] <= 109
 */
class Problem594: NSObject {
    /*
     思路： Map
     1: 遍历nums，添加到Map中，并记录每个数字的次数;
     2: 遍历dic，寻找key+1是否也在dic中，有的话，求出这2个值的个数和，并找到最大的2个值
     */
    func findLHS(_ nums: [Int]) -> Int {
        var dic: [Int: Int] = [:]
        
        // 1:遍历nums，添加到Map中，并记录每个数字的次数
        for n in nums {
            dic[n, default: 0] += 1
        }
        
        // 2: 遍历dic，寻找key+1是否也在dic中，有的话，求出这2个值的个数和，并找到最大的2个值
        var sum = 0
        for (key, num) in dic {
            if dic[key+1] != nil, sum < num + dic[key+1]! {
                sum = num + dic[key+1]!
            }
        }
        return sum
    }
}
